/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package continuity.View;

import continuity.Direction;
import java.awt.Graphics;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 *
 * @author FornetTeam
 */
public class GameView extends JPanel {
    private final MapView mapView;
    
    /**
     * A GameView konstruktora.
     * @param mapView A mapView, amit tartalmaz.
     */
    public GameView(MapView mapView){
        super(true);        //duplabufferelés
        this.mapView = mapView;
    }
    
    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        mapView.paintView(g);
    }
    
    /**
     * A karakter zuhan egy mezőt.
     * @param characterNumber A karakter sorszáma.
     */
    public void fall(Direction[] dirs){
        /**
         * A megfelelő karakterek pozíciójának a modelből való frissítésének
         * a kikapcsolása.
         */
        if (dirs[0] != null){
            mapView.setMoving(0, true);
        }
        if (dirs[1] != null){
            mapView.setMoving(1, true);
        }
        
        /**
         * Itt történik az animálás.
         */
        for(int i = 0; i < ViewParameters.ElementHeight / ViewParameters.SpeedY; i++){
            if (dirs[0] != null){
                if (dirs[0] == Direction.Down){
                    mapView.fall(0);
                } else {
                    mapView.jump(0);
                }
            }
            if (dirs[1] != null){
                if (dirs[1] == Direction.Down){
                    mapView.fall(1);
                } else {
                    mapView.jump(1);
                }
            }
            
            refresh();
            try {
                Thread.sleep(ViewParameters.TimerPeriodX);
            } catch (InterruptedException ex) {
                Logger.getLogger(GameView.class.getName()).log(Level.SEVERE, null, ex);
            }
        } 
        
        
        /**
         * A megfelelő karakterek pozíciójának a modelből való frissítésének
         * a bekapcsolása.
         */
        if (dirs[0] != null){
            mapView.setMoving(0, false);
        }
        if (dirs[1] != null){
            mapView.setMoving(1, false);
        }
        
        
        mapView.refreshCharacterPosition();
        refresh();
    }
    
    /**
     * A karaktert mozgató függvény.
     * @param characterNumber A karakter sorszáma.
     * @param dir A mozgás iránya.
     */
    public void move(Direction[] dirs){
        /**
         * A megfelelő karakterek pozíciójának a modelből való frissítésének
         * a kikapcsolása.
         */
        if (dirs[0] != null){
            mapView.setMoving(0, true);
        }
        if (dirs[1] != null){
            mapView.setMoving(1, true);
        }
        
        /**
         * Itt történik az animálás.
         */
        for(int i = 0; i < ViewParameters.ElementWidth / ViewParameters.SpeedX; i++){
            if (dirs[0] != null){
                mapView.move(0, dirs[0]);
            }
            if (dirs[1] != null){
                mapView.move(1, dirs[1]);
            }
            
            refresh();
            try {
                Thread.sleep(ViewParameters.TimerPeriodX);
            } catch (InterruptedException ex) {
                Logger.getLogger(GameView.class.getName()).log(Level.SEVERE, null, ex);
            }
        } 
        
        
        /**
         * A megfelelő karakterek pozíciójának a modelből való frissítésének
         * a bekapcsolása.
         */
        if (dirs[0] != null){
            mapView.setMoving(0, false);
        }
        if (dirs[1] != null){
            mapView.setMoving(1, false);
        }
        
        
        mapView.refreshCharacterPosition();
        refresh();
    }
    
    /**
     * Az üres mező elmozdítása megadott irányba.
     * @param dir A mozgatással ellentétes irány.
     */
    public void swap(Direction dir){
        mapView.swap(dir);
        refresh();
    }
    
    /**
     * Rá tudunk vele közelíteni a karakterre.
     * @param isZoomed true ha a nagyítva legyen a pálya, false, ha nincs.
     */
    public void setZoom(boolean isZoomed){
        mapView.setZoom(isZoomed);
    }
    
    /**
     * Lekérdezi, hogy rá vagyunk-e közelítve a karakterekre.
     * @return Igaz, ha rá vagyunk.
     */
    public boolean getZoom(){
        return mapView.getZoom();
    }
    
    /**
     * A meghívása esetén újrarajzolódik a teljes Game.
     */
    public void refresh(){
        repaint();
    }
    
    public void endGame(){
        JOptionPane.showMessageDialog(null,
                "A játékot végigvitted. :-)");
    }
}
